Установите TFTP-сервер на хост-компьютер и проверьте настройки
xmind@Ubuntu20:~$ sudo apt-get install tftpd-hpamind@Ubuntu20:~$ cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpaTFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure"В этой среде каталогом сервера является /srv/tftp.
Поскольку этот каталог доступен только для чтения, добавьте "--create" в TFTP_OPTIONS (как показано ниже), чтобы сделать его доступным для записи
xxxxxxxxxxmind@Ubuntu20:~$ sudo vi /etc/default/tftpd-hpa
# /etc/default/tftpd-hpaTFTP_USERNAME="tftp"TFTP_DIRECTORY="/srv/tftp"TFTP_ADDRESS=":69"TFTP_OPTIONS="--secure --create"
TFTP_USERNAME="tftp", что означает выполнение с правами tftp. Каталог сервера имеет права root, поэтому переключитесь на tftp. Кроме того, добавьте права на запись для размещения образов, полученных в результате сборки Petalinux
xxxxxxxxxxmind@Ubuntu20:~$ ls -l /srvtotal 4drwxr-xr-x 2 root nogroup 4096 Dec 8 13:11 tftpmind@Ubuntu20:~$ sudo chown -R tftp /srv/tftpmind@Ubuntu20:~$ sudo chmod 777 /srv/tftpmind@Ubuntu20:~$ ls -l /srvtotal 4drwxrwxrwx 2 tftp nogroup 4096 Dec 8 13:11 tftpВышеуказанные изменения настроек вступят в силу после перезапуска сервера
xxxxxxxxxxmind@Ubuntu20:~$ sudo service tftpd-hpa restartmind@Ubuntu20:~$ service tftpd-hpa status tftpd-hpa.service - LSB: HPA's tftp server Loaded: loaded (/etc/init.d/tftpd-hpa; generated) Active: active (running) since Mon 2025-08-25 13:55:37 CST; 43s ago Docs: man:systemd-sysv-generator(8) Process: 152053 ExecStart=/etc/init.d/tftpd-hpa start (code=exited, status=> Tasks: 1 (limit: 6989) Memory: 244.0K CGroup: /system.slice/tftpd-hpa.service └─152063 /usr/sbin/in.tftpd --listen --user tftp --address :69 --s>lines 1-9/9 (END)
Выполните конфигурацию системы в проекте Petalinux
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-config
Выберите Image Packaging Configuration, затем измените каталог tftpboot (/tftpboot) на каталог TFTP-сервера /srv/tftp. В качестве типа корневой файловой системы можно выбрать INITRD или EXT4; здесь мы выбираем EXT4.
Сохраните и выйдите, затем запустите petalinux-config -c u-boot для настройки u-boot
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-config -c u-bootВыберите Command line interface-> Network commands->serverip variable takes precedent over DHCP server IP
Сохраните и выйдите. Настройка завершена. При выполнении сборки результаты будут помещены в каталог TFTP-сервера.
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-buildmind@Ubuntu20:/$ ls /srv/tftp/BOOT.BIN config pxelinux.cfg rootfs.cpio.gz rootfs.ext4 rootfs.manifest system.bit system.dts u-boot-dtb.bin u-boot.elf vmlinux zynq_fsbl.elfboot.scr image.ub rootfs.cpio rootfs.cpio.gz.u-boot rootfs.jffs2 rootfs.tar.gz system.dtb u-boot.bin u-boot-dtb.elf uImage zImage
Выполните следующие шаги для подключения платы разработки к компьютеру. Шаги в основном те же, что и раньше.
Отформатируйте SD-карту в формат FAT32 или сохраните предыдущую конфигурацию разделов (FAT32+EXT4), просто удалив ее содержимое.
Установите SD-карту в плату разработки
Подключитесь к ПК (Ubuntu) с помощью USB-кабеля
Подключите Ethernet-порт платы разработки к локальной сети
Включите питание платы разработки
Откройте программу-помощник для отладки через последовательный порт, чтобы проверить подключенный порт
Запустите программу последовательного терминала на Ubuntu
В этом состоянии загрузчик отсутствует, и на последовательной консоли еще нет вывода. Для загрузки через JTAG выполните следующую команду в каталоге проекта Petalinux на хост-компьютере:
xxxxxxxxxx# Open Vivado environment variablesmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ source /opt/pkg/Vivado/2021.1/settings64.sh# Place the hw_server process as a daemon in the backgroundmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ hw_server -s tcp::3121 &
# hw_server is now openINFO: hw_server application startedINFO: Use Ctrl-C to exit hw_server application
INFO: To connect to this hw_server instance use url: TCP:Ubuntu20:3121
# Output boot logs to the serial consolemind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-boot --jtag --u-boot --fpga --hw_server-url TCP:Ubuntu20:3121[INFO] Sourcing buildtoolsINFO: Launching XSDB for file download and boot.INFO: This may take a few minutes, depending on the size of your image.rlwrap: warning: your $TERM is 'xterm-256color' but rlwrap couldn't find it in the terminfo database. Expect some problems.: Inappropriate ioctl for deviceINFO: Downloading ELF file: /home/mind/petalinux_projects/petalinux-mind/images/linux/zynq_fsbl.elf to the target. INFO: Loading image: /home/mind/petalinux_projects/petalinux-mind/images/linux/system.dtb at 0x00100000 INFO: Downloading ELF file: /home/mind/petalinux_projects/petalinux-mind/images/linux/u-boot.elf to the target. INFO: SOC Silicon version is 3.1.Это выведет логи загрузки в последовательную консоль.
xxxxxxxxxx....DHCP client bound to address 192.168.3.193 (991 ms)*** ERROR: `serverip' not setCannot autoload with TFTPGETZynq>Примечание: Если при вводе petalinux-boot --jtag --u-boot --fpga --hw_server-url TCP:Ubuntu20:3121 возникает ошибка, проверьте следующее:
Установите совместимость USB-устройства виртуальной машины на USB3.1
Откройте Xilinx Mind в виртуальной машине для обнаружения интерфейса JTAG
Настройте u-boot на этой последовательной консоли для загрузки по TFTP.
xxxxxxxxxx# Get ubuntu ip in the virtual machinemind@Ubuntu20:/$ ifconfigenp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.157 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::1c4c:bc28:1b9a:bcd2 prefixlen 64 scopeid 0x20<link> ether 08:00:27:5e:09:4c txqueuelen 1000 (Ethernet) RX packets 172349 bytes 20517061 (20.5 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 59254 bytes 71921656 (71.9 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
xxxxxxxxxx# Set the IP address of the server (host PC) on the serial consoleZynq> setenv serverip 192.168.3.157# During boot, the following will be executed:# - Obtain the board's IP address (dhcp)# - Get pxe boot settings from the server (pxe get)# - Get the image from the server and execute (pxe boot)Zynq> dhcp;pxe get;pxe boot;Настройка завершена. Перезагрузите плату разработки, затем снова выполните petalinux-boot --jtag --u-boot --fpga --hw_server-url TCP:Ubuntu20:3121. Linux загрузится, и вы сможете войти в систему, как и раньше.
Поскольку команда dhcp;pxe get;pxe boot; использует DHCP для автоматического назначения IP-адреса, что может привести к сбою входа в систему Linux, на этом шаге вы можете установить IP-адрес платы. Убедитесь, что IP-адреса с обеих сторон совпадают.
xxxxxxxxxx# Set the board's IP address on the serial consoleZynq> setenv ipaddr 192.168.3.193Теперь вы можете загружать Petalinux по сети с помощью TFTP. Таким образом, вам не нужно каждый раз помещать образы на SD-карту после кастомизации и запуска petalinux-build. Требуется перезагрузка платы разработки по питанию.
Однако при этом методе rootfs.cpio.gz.u-boot извлекается и используется при каждой загрузке, и любые внесенные изменения не будут сохранены после запуска Linux.
Если rootfs настроен на размещение в разделе ROOT SD-карты, результаты изменений будут сохранены на SD-карте.
Эту проблему можно решить с помощью NFS (см. следующий раздел):
Установите NFS-сервер на хост-компьютер и создайте каталог сервера. Этот каталог может находиться где угодно. Здесь мы будем использовать /srv/nfs.
xxxxxxxxxxmind@Ubuntu20:~$ sudo apt install nfs-kernel-servermind@Ubuntu20:~$ sudo mkdir /srv/nfsmind@Ubuntu20:~$ ls -l /srv/total 8drwxr-xr-x 2 root root 4096 8月 25 10:07 nfsdrwxrwxrwx 3 tftp nogroup 4096 8月 22 16:20 tftp
Затем установите разрешения для подключений от NFS-клиентов. Добавьте следующее в конец файла /etc/exports.
xxxxxxxxxxmind@Ubuntu20:~$ sudo vi /etc/exports#Добавленное содержимое##1. /srv/nfs: путь к каталогу NFS-сервера#2. 192.168.3.193: IP-адрес клиента (отладочной платы)#3. В скобках: опции#/srv/nfs 192.168.3.193(rw,sync,no_root_squash,no_subtree_check)Вышеуказанные изменения настроек вступят в силу после перезапуска сервера.
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ sudo service nfs-server restartmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ service nfs-server status nfs-server.service - NFS server and services Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled) Active: active (exited) since Tue 2025-08-26 10:28:14 CST; 10s ago Process: 283269 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS) Process: 283270 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)Продолжайте на основе предыдущей конфигурации TFTP.
Проверьте версии, поддерживаемые NFS-сервером (хост-компьютером).
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ sudo cat /proc/fs/nfsd/versions-2 +3 +4 +4.1 +4.2Запустите petalinux-config, выберите Image Packaging Configuration и измените Root filesystem type на NFS. Измените Location of NFS root directory на каталог NFS-сервера /srv/nfs.
Сохраните и выйдите, затем запустите petalinux-config -c kernel, перейдите в File systems -> Network File Systems и включите следующее:
NFS 4.1 появляется после включения NFS 4, NFS 4.2 появляется после включения NFS 4.1.
Перейдите в Networking support -> Networking options и включите следующие опции. Все опции включены по умолчанию.
Сохраните и выйдите. Поскольку корневая файловая система была изменена на NFS, параметры загрузки изменятся.
Соберите дерево устройств, чтобы увидеть изменения: оно содержит информацию, связанную с NFS.
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-build -c device-tree[INFO] Sourcing buildtools[INFO] Building device-tree[INFO] Sourcing build environment[INFO] Generating workspace directoryINFO: bitbake virtual/dtb...NOTE: Executing TasksNOTE: Tasks Summary: Attempted 748 tasks of which 729 didn't need to be rerun and all succeeded.INFO: Successfully copied built images to tftp dir: /srv/tftp[INFO] Successfully built device-tree
mind@Ubuntu20:~/petalinux_projects/petalinux-mind$ cat components/plnx_workspace/device-tree/device-tree/system-conf.dtsi .../ { chosen { bootargs = "console=ttyPS0,115200 earlycon root=/dev/nfs nfsroot=192.168.3.157:/srv/nfs,tcp ip=dhcp rw"; stdout-path = "serial0:115200n8"; };};...
Также необходимо указать, какую версию NFS использовать. Скопируйте выбранное содержимое в system-user.dtsi и добавьте желаемую версию NFS. Здесь мы используем версию 4.2, добавляя nfsvers=4.2 после tcp.
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi/include/ "system-conf.dtsi"/ { chosen { bootargs = "console=ttyPS0,115200 earlycon root=/dev/nfs nfsroot=192.168.3.157:/srv/nfs,tcp,nfsvers=4.2 ip=dhcp rw"; stdout-path = "serial0:115200n8"; };};
На этом конфигурация завершена. Запустите petalinux-build.
Извлеките rootfs в каталог NFS-сервера.
xxxxxxxxxx$ sudo tar xf images/linux/rootfs.tar.gz -C /srv/nfs/Аналогично, следуйте шагам из раздела "Загрузка Petalinux через TFTP", чтобы запустить последовательную консоль через виртуальную машину.
Если предыдущие настройки переменных окружения были сохранены, начнется загрузка по TFTP. Нажмите любую клавишу на последовательной консоли до окончания обратного отсчета, чтобы остановить автозагрузку.
xxxxxxxxxxHit any key to stop autoboot: 0Zynq>Настройте IP-адрес сервера (IP хоста) и команду загрузки.
xxxxxxxxxx#Установите IP-адрес сервера (хост-компьютера) в последовательной консолиZynq> setenv serverip 192.168.3.157#Во время загрузки будет выполнено следующее:#- Получить IP-адрес платы (dhcp)#- Загрузить образ Fit (image.ub) с TFTP-сервера и разместить его по адресу 0x10000000 (tftpboot 0x10000000 image.ub)#- Указать образ (адрес) и загрузить Linux (bootm 0x10000000)Zynq> setenv bootcmd "dhcp;tftpboot 0x10000000 image.ub;bootm 0x10000000;"Конфигурация завершена. Перезагрузите отладочную плату и выполните petalinux-boot --jtag --u-boot --fpga --hw_server-url TCP:Ubuntu20:3121. Linux загрузится, и вы сможете войти в систему, как и раньше.
Поскольку rootfs находится на хост-компьютере, любое отредактированное содержимое не будет потеряно при каждой перезагрузке платы.